#这些值即使在子Makefile中被更改，当退出子Makefile时，将被还原
export CC BUILD_DIR TEST_DIR START_MAKE
export LIB_DIR_DYNAMIC LIB_DIR_STATIC

CC = gcc
TARGET = app
#方便多个Makefile生成的文件放到统一位置
START_MAKE = $(shell pwd)
BUILD_DIR = build

DEFINES = _GNU_SOURCE
INC_DIR = inc \
	src/linux \
	src/linux/client \
	src/linux/server

SRC_DIR = src \
	src/linux \
	src/linux/client \
	src/linux/server
#main函数所在的文件位置
TEST_DIR = src/test

LIB_DIR_DYNAMIC = lib/dynamic_lib
LIB_DIR_STATIC = lib/static_lib

#指定头文件的路径
CFLAGS = $(patsubst %, -I%, $(INC_DIR))
CFLAGS += $(patsubst %, -D%, $(DEFINES))
CFLAGS += -lpthread
CFLAGS += -g
#指定源文件的路径
VPATH=$(SRC_DIR)

#头文件
INCS = $(foreach dir,$(INC_DIR),$(wildcard $(dir)/*.h))
#源文件
SRCS = $(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.c))
#目标文件（*.o） 每一个源文件对应一个目标文件
OBJS = $(patsubst %.c, $(BUILD_DIR)/%.o, $(notdir $(SRCS)))

#使用动态库和静态库的方法一样
#指定要用到的动/静态库文件(如果静态库和动态库同名时，gcc命令将优先使用动态库)
DYNAMIC_LIBS = $(foreach dir,$(LIB_DIR_DYNAMIC),$(wildcard $(dir)/*.so))
STATIC_LIBS = $(foreach dir,$(LIB_DIR_STATIC),$(wildcard $(dir)/*.a))

#target:
#	echo $(origin M)

#生成目标文件
$(BUILD_DIR)/$(TARGET): $(OBJS) $(TEST_DIR)/test.c $(STATIC_LIBS)
	$(CC) -o $@ $^ $(CFLAGS)
#$(BUILD_DIR)/$(TARGET): $(OBJS) $(TEST_DIR)/test.c $(DYNAMIC_LIBS)
#	$(CC) -o $@ $^ $(CFLAGS)
#隔开main函数所在的文件 
#$(BUILD_DIR)/$(TARGET): $(OBJS) $(STATIC_LIBS) #使用静态库
#	$(CC) -o $@ $^
#$(BUILD_DIR)/$(TARGET): $(OBJS) $(DYNAMIC_LIBS)#使用动态库
#	$(CC) -o $@ $^

#生成目标文件.o (待尝试:可以改动一下，每个源文件对应一个头文件)
$(BUILD_DIR)/%.o: %.c $(INCS) | create_build
	$(CC) -c $< -o $@  $(CFLAGS)

.PHONY:create_build lib_create debug clean summake sumlib

create_build:
	@mkdir -p $(BUILD_DIR)

#库的生成依赖于.o文件
lib_create: $(OBJS)#注意删除带有main函数的文件
#动态库生成失败的两个原因：原.c文件的函数自己调用自己的函数，打印输出中的一个变量有误，，原因都未知
#	gcc -shared -fPIC -o $(LIB_DIR_DYNAMIC)/libcommon.so $^ #失败
	ar -rcs $(LIB_DIR_STATIC)/libcommon.a $^
	

#	ar -rcs $(LIB_DIR_DYNAMIC)/libclient.a $(BUILD_DIR)/client.o
#	ar -rcs $(LIB_DIR_DYNAMIC)/libserver.a $(BUILD_DIR)/server.o
#	gcc -shared -fPIC -o $(LIB_DIR_DYNAMIC)/libclient.so $(BUILD_DIR)/client.o
#	gcc -shared -fPIC -o $(LIB_DIR_DYNAMIC)/libserver.so $(BUILD_DIR)/server.o

debug:
	@echo "LD_LIBRARY_PATH:  ${LD_LIBRARY_PATH}"
	@echo "VPATH:            $(VPATH)"
	@echo "SRC_DIR:          $(SRC_DIR)"
	@echo "OBJS:             $(OBJS)"

clean:
	@make clean -C src/linux/client/
	@make clean -C src/linux/server/
	@rm -rf $(BUILD_DIR)/*

summake:
	@make -C src/linux/client/
	@make -C src/linux/server/
#或	@make -f src/linux/server/Makefile
#或	@make -f src/linux/client/Makefile
#区别：用echo $(shell pwd)
#第一组：/home/embedfire/sharedir/communication/src/linux/* (跳到对应目录中)
#第二组：/home/embedfire/sharedir/communication (还是本目录下)
	
sumlib:
	@make lib_create -C src/linux/client/
	@make lib_create -C src/linux/server/
